home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / whdload / rawdic17.lha / Examples / Archipelagos.islave.asm next >
Assembly Source File  |  1999-03-02  |  3KB  |  126 lines

  1.  
  2.     ; Archipelagos imager
  3.  
  4.     ; A track contains 5 sectors, each containing 1024 bytes data.
  5.  
  6.     ; Sector format description:
  7.  
  8.     ; sync ($4489)
  9.     ; 1 unused byte ($FF)
  10.     ; 1 byte which indicates the distance to the track gap
  11.     ; 1 byte sector number (0-5)
  12.     ; 1 word checksum
  13.     ; 512 words data
  14.  
  15.     ; The checksum is calculated by adding all 512 data words.
  16.  
  17.     ; The MFM decoding is done by skipping all odd bits in the bitstream.
  18.  
  19.         incdir    Includes:
  20.         include    RawDIC.i
  21.  
  22.         SLAVE_HEADER
  23.         dc.b    1    ; Slave version
  24.         dc.b    0    ; Slave flags
  25.         dc.l    DSK_1    ; Pointer to the first disk structure
  26.         dc.l    Text    ; Pointer to the text displayed in the imager window
  27.  
  28.         dc.b    "$VER:"
  29. Text:        dc.b    "Archipelagos imager V1.0",10,"by John Selck on 02.03.1999",0
  30.         cnop    0,4
  31.  
  32. DSK_1:        dc.l    0        ; Pointer to next disk structure
  33.         dc.w    1        ; Disk structure version
  34.         dc.w    0        ; Disk flags
  35.         dc.l    TL_1        ; List of tracks which contain data
  36.         dc.l    0        ; UNUSED, ALWAYS SET TO 0!
  37.         dc.l    FL_DISKIMAGE    ; List of files to be saved
  38.         dc.l    0        ; Table of certain tracks with CRC values
  39.         dc.l    0        ; Alternative disk structure, if CRC failed
  40.         dc.l    0        ; Called before a disk is read
  41.         dc.l    0        ; Called after a disk has been read
  42.  
  43. TL_1:        TLENTRY    0,0,$1400,SYNC_STD,DMFM_STD
  44.         TLENTRY    1,1,$1400,SYNC_INDEX,DMFM_NULL
  45.         TLENTRY    2,22,$1400,SYNC_STD,DMFM_Arc
  46.         TLENTRY    23,25,$1400,SYNC_INDEX,DMFM_NULL
  47.         TLENTRY    26,48,$1400,SYNC_STD,DMFM_Arc
  48.         TLENTRY    49,50,$1400,SYNC_INDEX,DMFM_NULL
  49.         TLENTRY    51,67,$1400,SYNC_STD,DMFM_Arc
  50.         TLENTRY    68,74,$1400,SYNC_INDEX,DMFM_NULL
  51.         TLENTRY    75,76,$1400,SYNC_STD,DMFM_Arc
  52.         ;TLENTRY    77,99,$1400,SYNC_INDEX,DMFM_NULL
  53.         ;TLENTRY    100,100,SYNC_STC,DMFM_Arc
  54.         TLEND
  55.  
  56.     ; track 100 is formatted but contains obsolete data
  57.  
  58. DMFM_Arc:
  59.  
  60.         lea    SectorFlags(pc),a2
  61.         moveq    #4,d1
  62. .l0        sf    (a2)+        ; clear sector flags
  63.         dbra    d1,.l0
  64.  
  65.         moveq    #4,d1
  66.         bra.b    .skip        ; first sync is already synced
  67. .l1        jsr    rawdic_NextSync(a5)
  68. .skip        bsr.b    DMFM_ArcBlock
  69.         bne.b    .error
  70.         dbra    d1,.l1
  71.  
  72.         lea    SectorFlags(pc),a2
  73.         moveq    #4,d1
  74. .l2        tst.b    (a2)+        ; if one sector is missing, one of
  75.         dbeq    d1,.l2        ; these flags will be FALSE
  76.         beq.b    .nosect
  77.  
  78.         moveq    #IERR_OK,d0
  79. .error        rts
  80. .nosect        moveq    #IERR_NOSECTOR,d0
  81.         rts
  82.  
  83. DMFM_ArcBlock:    ; decoder of a block
  84.  
  85.         movem.l    d1/a0-a1,-(sp)
  86.  
  87.         addq.l    #1*2,a0        ; skip 1 byte
  88.  
  89.         bsr.b    NextWord    ; get sector number and distance to gap
  90.         and.w    #$00ff,d0    ; mask sector number
  91.         subq.b    #1,d0
  92.         cmp.b    #5,d0        ; sector number has to be 1 to 5
  93.         bhs.b    .error
  94.  
  95.         lea    SectorFlags(pc),a2
  96.         st    (a2,d0.w)    ; set flag for sector
  97.  
  98.         mulu.w    #$0400,d0    ; calculate offset in track
  99.         add.l    d0,a1
  100.  
  101.         bsr.b    NextWord    ; get checksum
  102.         move.w    d0,d2
  103.  
  104.         move.w    #$01ff,d1
  105. .l0        bsr.b    NextWord    ; decode data
  106.         move.w    d0,(a1)+
  107.         sub.w    d0,d2
  108.         dbra    d1,.l0
  109.  
  110.         tst.w    d2        ; checksum ok?
  111.         bne.b    .error
  112.  
  113.         movem.l    (sp)+,d1/a0-a1
  114.         moveq    #IERR_OK,d0
  115.         rts
  116. .error        movem.l    (sp)+,d1/a0-a1
  117.         moveq    #IERR_CHECKSUM,d0
  118.         rts
  119.  
  120. NextWord:    move.l    (a0)+,d0
  121.         BITSKIP_W d0
  122.         rts
  123.  
  124. SectorFlags:    ds.b    5
  125.  
  126.